package com.agileboot.domain.system.tag;

import com.agileboot.common.core.page.PageDTO;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.system.tag.command.TagAddCommand;
import com.agileboot.domain.system.tag.command.TagUpdateCommand;
import com.agileboot.domain.system.tag.db.SysTagEntity;
import com.agileboot.domain.system.tag.db.SysTagService;
import com.agileboot.domain.system.tag.dto.TagDTO;
import com.agileboot.domain.system.tag.model.TagModel;
import com.agileboot.domain.system.tag.model.TagModelFactory;
import com.agileboot.domain.system.tag.query.TagQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

/**
 * 标签 应用服务
 */
@Service
@RequiredArgsConstructor
public class TagApplicationService {

    @Qualifier("sysTagServiceImpl")
    private final SysTagService tagService;

    private final TagModelFactory tagModelFactory;

    public PageDTO<TagDTO> getTagList(TagQuery query) {
        Page<SysTagEntity> page = tagService.getTagList(query.toPage(), query.toQueryWrapper());
        List<TagDTO> records = page.getRecords().stream().map(TagDTO::new).collect(Collectors.toList());
        return new PageDTO<>(records, page.getTotal());
    }

    public TagDTO getTagInfo(Long id) {
        TagModel tagModel = tagModelFactory.loadById(id);
        return new TagDTO(tagModel);
    }

    public void addTag(TagAddCommand addCommand) {
        TagModel tagModel = tagModelFactory.create();
        tagModel.loadAddCommand(addCommand);
        tagModel.insert();
    }

    public void updateTag(TagUpdateCommand updateCommand) {
        TagModel tagModel = tagModelFactory.loadById(updateCommand.getTagId());
        tagModel.loadUpdateCommand(updateCommand);
        tagModel.updateById();
    }

    public void deleteTag(BulkOperationCommand<Integer> deleteCommand) {
        tagService.removeBatchByIds(deleteCommand.getIds());
    }
}
